package gdr.dev.creator;

import gdr.player.DefaultPlayer;
import gdr.player.DefaultSummonedPlayer;
import gdr.player.Statistiche;
import gdr.dev.*;

public class PlayerCreator {

	public static DefaultPlayer createTank(SuperGDR9000 gdr, String name, int level){
		return createTank(gdr, name, level, null);
	}
	public static DefaultPlayer createTank(SuperGDR9000 gdr, String name, int level, DefaultPlayer summoner){
		DefaultPlayer p = createPlayer(name, level, summoner, 5);
		Statistiche s = p.getBaseStat();
		s.setStat(Statistiche.HP, 20);
		s.setStat(Statistiche.MP, 7);
		s.setStat(Statistiche.ATK, 18);
		s.setStat(Statistiche.DEF, 24);
		s.setStat(Statistiche.MAG, 8);
		s.setStat(Statistiche.RES, 12);
		
		s = p.getIncrementStat();
		s.setStat(Statistiche.HP, 120);
		s.setStat(Statistiche.MP, 70);
		s.setStat(Statistiche.ATK, 100);
		s.setStat(Statistiche.DEF, 110);
		s.setStat(Statistiche.MAG, 80);
		s.setStat(Statistiche.RES, 90);
		
		p.setActualHP(p.getMaxStat(Statistiche.HP));
		p.setActualMP(p.getMaxStat(Statistiche.MP));
		
		p.setClasse(ClassCreator.createClasseTank(gdr));
		
		return p;
	}
	
	public static DefaultPlayer createWizard(SuperGDR9000 gdr, String name, int level){
		return createWizard(gdr, name, level, null);
	}
	
	public static DefaultPlayer createWizard(SuperGDR9000 gdr, String name, int level, DefaultPlayer summoner){
		DefaultPlayer p = createPlayer(name, level, summoner, 3);
		
		Statistiche s = p.getBaseStat();
		s.setStat(Statistiche.HP, 13);
		s.setStat(Statistiche.MP, 14);
		s.setStat(Statistiche.ATK, 12);
		s.setStat(Statistiche.DEF, 13);
		s.setStat(Statistiche.MAG, 20);
		s.setStat(Statistiche.RES, 18);
		
		s = p.getIncrementStat();
		s.setStat(Statistiche.HP, 80);
		s.setStat(Statistiche.MP, 100);
		s.setStat(Statistiche.ATK, 60);
		s.setStat(Statistiche.DEF, 80);
		s.setStat(Statistiche.MAG, 120);
		s.setStat(Statistiche.RES, 110);
		
		p.setActualHP(p.getMaxStat(Statistiche.HP));
		p.setActualMP(p.getMaxStat(Statistiche.MP));
		
		p.setClasse(ClassCreator.createClasseWizard(gdr));
		
		return p;
	}
	
	public static DefaultPlayer createHealer(SuperGDR9000 gdr, String name, int level){
		return createHealer(gdr, name, level, null);
	}
	
	public static DefaultPlayer createHealer(SuperGDR9000 gdr, String name, int level, DefaultPlayer summoner){
		DefaultPlayer p = createPlayer(name, level, summoner, 3);
		
		Statistiche s = p.getBaseStat();
		s.setStat(Statistiche.HP, 13);
		s.setStat(Statistiche.MP, 14);
		s.setStat(Statistiche.ATK, 12);
		s.setStat(Statistiche.DEF, 13);
		s.setStat(Statistiche.MAG, 20);
		s.setStat(Statistiche.RES, 18);
		
		s = p.getIncrementStat();
		s.setStat(Statistiche.HP, 80);
		s.setStat(Statistiche.MP, 100);
		s.setStat(Statistiche.ATK, 60);
		s.setStat(Statistiche.DEF, 80);
		s.setStat(Statistiche.MAG, 120);
		s.setStat(Statistiche.RES, 110);
		
		p.setActualHP(p.getMaxStat(Statistiche.HP));
		p.setActualMP(p.getMaxStat(Statistiche.MP));
		
		p.setClasse(ClassCreator.createClasseHealer(gdr));
		
		return p;
	}
	
	public static DefaultPlayer createSummoner(SuperGDR9000 gdr, String name, int level){
		return createSummoner(gdr, name, level, null);
	}
	public static DefaultPlayer createSummoner(SuperGDR9000 gdr, String name, int level, DefaultPlayer summoner){
		DefaultPlayer p = createPlayer(name, level, summoner, 3);
		
		Statistiche s = p.getBaseStat();
		s.setStat(Statistiche.HP, 12);
		s.setStat(Statistiche.MP, 15);
		s.setStat(Statistiche.ATK, 13);
		s.setStat(Statistiche.DEF, 12);
		s.setStat(Statistiche.MAG, 17);
		s.setStat(Statistiche.RES, 16);
		
		s = p.getIncrementStat();
		s.setStat(Statistiche.HP, 80);
		s.setStat(Statistiche.MP, 90);
		s.setStat(Statistiche.ATK, 70);
		s.setStat(Statistiche.DEF, 90);
		s.setStat(Statistiche.MAG, 110);
		s.setStat(Statistiche.RES, 100);
		
		p.setClasse(ClassCreator.createClasseSummoner(gdr, p));
		p.setActualHP(p.getMaxStat(Statistiche.HP));
		p.setActualMP(p.getMaxStat(Statistiche.MP));
		
		return p;
	}
	
	/**
	 * Crea la struttura base di un personaggio
	 * @param name
	 * @param level
	 * @param isSummoned
	 * @param move
	 * @return
	 */
	protected static DefaultPlayer createPlayer(String name, int level, DefaultPlayer summoner, int move){
		DefaultPlayer p = new DefaultPlayer();
		if (summoner!=null){
			p = new DefaultSummonedPlayer();
			((DefaultSummonedPlayer)p).setSummoner(summoner);
		}
		p.setName(name);
		if (summoner==null){
			level = 10;
			while(p.getLevel()!=level)
				p.gainExperience(p.expToNextLevel(p.getLevel()));
		}
			
		Statistiche s = new Statistiche();
		p.setBaseStat(s);
		
		s = new Statistiche();
		p.setIncrementStat(s);
		
		p.setMove(move);
		return p;
	}
}
